package com.nortal.jroad.client.service.callback; import java.io.IOException; import javax.xml.namespace.QName; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPMessage; import javax.xml.transform.TransformerException; import javax.xml.transform.dom.DOMResult; import org.apache.xmlbeans.XmlOptions; import org.springframework.oxm.Marshaller; import org.springframework.oxm.xmlbeans.XmlBeansMarshaller; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.client.core.WebServiceMessageCallback; import org.springframework.ws.soap.saaj.SaajSoapMessage; import com.nortal.jroad.client.service.consumer.StandardXRoadConsumer; import com.nortal.jroad.model.XmlBeansXRoadMetadata; /** * @author Dmitri Danilkin * @author Lauri Lättemäe (lauri.lattemae@nortal.com) - protocol 4.0 */ public class StandardXRoadConsumerCallback implements WebServiceMessageCallback { private final Object object; private final XRoadMessageCallback callback; private final XmlBeansXRoadMetadata metadata; public StandardXRoadConsumerCallback(Object object, XRoadMessageCallback callback, XmlBeansXRoadMetadata metadata) { this.object = object; this.callback = callback; this.metadata = metadata; } @Override public void doWithMessage(WebServiceMessage request) throws IOException, TransformerException { SaajSoapMessage message = (SaajSoapMessage) request; SOAPMessage mes = message.getSaajMessage(); try { mes.getSOAPPart().getEnvelope().addNamespaceDeclaration(StandardXRoadConsumer.ROOT_NS, metadata.getRequestElementNs()); getMarshaller().marshal(object, new DOMResult(mes.getSOAPBody())); } catch (SOAPException e) { throw new RuntimeException("Invalid SOAP message"); } callback.doWithMessage(request); } protected Marshaller getMarshaller() { XmlBeansMarshaller marshaller = new XmlBeansMarshaller(); marshaller.setXmlOptions(new XmlOptions().setSaveSyntheticDocumentElement(new QName(metadata.getRequestElementNs(), metadata.getRequestElementName(), StandardXRoadConsumer.ROOT_NS))); return marshaller; } }